package com.mastercard.assets.web.forms.process;

import com.mastercard.assets.MasterCardException;
import com.mastercard.assets.flows.FlowUtil;
import com.mastercard.assets.flows.process.FlowProcessContext;
import com.mastercard.assets.flows.process.FlowProcessInit;
import com.mastercard.assets.flows.process.FlowProcessPost;
import com.mastercard.assets.flows.process.FlowProcessPrevious;
import com.mastercard.assets.flows.process.FlowProcessResult;
import com.mastercard.assets.flows.to.FlowCampaignTO;
import com.mastercard.assets.jpa.TblAsset;
import com.mastercard.assets.jpa.TblCampania;
import com.mastercard.assets.jpa.TblCampaniaMes;
import com.mastercard.assets.jpa.TblCampaniaProductoAdq;
import com.mastercard.assets.jpa.TblCampaniaProductoUsuario;
import com.mastercard.assets.jpa.TblFlujo;
import com.mastercard.assets.jpa.TblForma;
import com.mastercard.assets.jpa.TblPaquete;
import com.mastercard.assets.jpa.TblPreimplementacion;
import com.mastercard.assets.jpa.TblProducto;
import com.mastercard.assets.jpa.TblTarea;
import com.mastercard.assets.jpa.TblTareaPreimplementacion;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.struts.forms.FlowProcessForm;
import com.mastercard.assets.web.util.to.TblAssetWraper;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URL;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;

public class PreimplementationAutorizarCampanaFormProcess
implements 
        FlowProcessInit , 
		FlowProcessPrevious , 
		FlowProcessPost
{
    public FlowProcessResult loadFormData( FlowProcessContext ctx )
		throws
			MasterCardException
 {
                TblTareaPreimplementacion tblTareaPreimplementacion = ctx.getTblTareaPreimplementacion( ) ;//
		
		TblCampania campania = tblTareaPreimplementacion.getTblPreimplementacion( ).getTblCampania( ) ;
		
		TblPreimplementacion tblPreimplementacion = tblTareaPreimplementacion.getTblPreimplementacion( ) ;//
                
                // toma todos los registros correspondientes de tblCampaniaProductoUsuario
                List< TblCampaniaProductoUsuario > tblCampaniaProductoUsuario = MasterCardDAO.getAllActiveCampaignProdUsrByCampaingId( campania.getCveCampania( ) ) ; 
                
                // toma todos los registros correspondientes de tblCampaniaProductoAdq
                List< TblCampaniaProductoAdq > tblCampaniaProductoAdq = MasterCardDAO.getAllActiveCampaignProdAdqByCampaingId( campania.getCveCampania( ) ) ; 
                
                //System.out.println("RealPath:::: "+ request.getRealPath("/") );
                
                int tamanio = campania.getMeses( ) ;
                int[] meses = new int[tamanio] ;
                int[] ttp = new int[campania.getTblProductos( ).size( )] ;
                int totalp = 0 ;
                int tMes = 0 ;
                int vtar = 0 ;
                
                List<TblCampaniaMes> TblCampaniaMes = new ArrayList< TblCampaniaMes >( ) ;
                
                //List< TblCampaniaMes > tcm = new ArrayList< TblCampaniaMes >( ) ;
                if ( tblCampaniaProductoUsuario != null )
                {
                        for ( TblCampaniaProductoUsuario tcpu : tblCampaniaProductoUsuario )
                    {
                        for ( TblCampaniaMes tcm : tcpu.getTblCampaniaMeses( ) )
                        {
                            TblCampaniaMes.add( tcm ) ;
                        }
                    }
                }
                
                int total = 0 ;
                for (int x = 0 ; x < tamanio  ; x++  )
                {
                    meses[ x ] = x + 1 ;
                }
                
                
                    for ( TblProducto tp : campania.getTblProductos() )
                    {
                        
                        for (TblCampaniaProductoAdq tca :  tblCampaniaProductoAdq )
                        {
                            vtar = tca.getTarjetas( ) ;                            
                            if ( tca.getTblProducto( ).getCveProducto( ) == tp.getCveProducto( ) )
                            {
                                ttp[ tMes ] += tca.getTarjetas( ) ;
                                totalp += vtar ;                                
                            }
                        }
                        tMes += 1 ;
                    }                    
                
                    for( int r = 0 ; r < ttp.length ; r++ ){
                        total += ttp[ r ] ;
                    }
                
//                int total = totalp ;
                
                // toma todos los paquetes
                List< TblPaquete > paquetes = campania.getTblPaquetes( ) ;
                
                List< TblAssetWraper > assetS = new ArrayList< TblAssetWraper >( ) ;
                
                // recorre los paquetes
		for( TblPaquete paq : paquetes )
		{
			// toma el asset al que pertenece el paquete
			TblAsset asset = paq.getTblAsset( ) ;
			
			// en caso del null
			if( asset == null )
				// siguiente
				continue ;
			
			// hace la comparacion con los que ya estan
			boolean yaEsta = false ;
			
			TblAssetWraper wraper = null ;
			
			// recorre los assets
			for( TblAssetWraper as : assetS )
				// en el caso de que ya haya una igual
				if( as.getCveAsset( ) == asset.getCveAsset( ) )
				{
					// cambia bandera
					yaEsta = true ;
					
					wraper = as ;
					
					// quiebra el ciclo
					break ;
				}
			
			// en caso de que no exista
			if( ! yaEsta )
				// lo agrega
				assetS.add( new TblAssetWraper( asset ) ) ;
			// en caso de que si exista
			else
				wraper.addPackage( ) ;
				
		}
		
//		int cveTareaPreimplementacion = tblTareaPreimplementacion.getCveTareaPreimplementacion( ) ;
//		int cvePreimplementacion = tblPreimplementacion.getCvePreimplementacion( ) ;
//		int cveAsset = tblTareaPreimplementacion.getTblAsset( ).getCveAsset( ) ;
//		int cveFirstWork = tblTareaPreimplementacion.getTblTarea( ).getCveTarea( ) ;
		
		TblFlujo tblFlujo = tblPreimplementacion.getTblFlujo( ) ;//
                
                ArrayList assetNmae = new ArrayList( ) ,
                          tipoPaq = new ArrayList( ) ,
                          numPaq = new ArrayList( ) , 
                        costoPaq = new ArrayList( ) ,
                        fondeo = new ArrayList( ) ;
                
                float costoCampania = 0 , inverBanco = Float.parseFloat( campania.getInversion( ).trim( ) ), laverage = 0 ;
                
                List< TblPreimplementacion > campPreImpl = campania.getTblPreimplementacions( ) ;
                
                int i = 0 ;
                for( TblPreimplementacion cp : campPreImpl ){// recorre preimplementacion ini
                    
                    List< TblAsset > assetList = cp.getTblAssets( ) ;
                    
                    assetNmae.add(i, assetList.get( 0 ).getNombre( ) ) ;
                    
                    TblAsset asset = assetList.get( 0 ) ;
                    
                    List< TblPaquete > packCamp = campania.getTblPaquetes( ) ;
                    int sencillosFondeoLocal = 0, doblesFondeoLocal = 0, sencillosFondeoRegion = 0, doblesFondeoRegion = 0 ;
                    float costoDoblesFondeoLocal = 0 , costoSencilloFondeoLocal = 0 , costoDoblesFondeoRegio = 0 , costoSencilloFondeoRegio = 0 ;                            
                    
                    for( TblPaquete p : packCamp ){//recorre paquetes ini
                        
                        if( p.getTblAsset( ).getCveAsset( ) == asset.getCveAsset( ) ){
                            
                            if( p.getHabitacion( ) == 1 && p.getFondeado( ) == 1 ){//SL
                                
                                sencillosFondeoLocal ++ ;
                                costoSencilloFondeoLocal += asset.getCostoSenLoc( ) ;
                                costoCampania += costoSencilloFondeoLocal ;
                                
                            }else
                                if( p.getHabitacion( ) == 1 && p.getFondeado( ) == 2 ){//SR
                                    
                                    sencillosFondeoRegion ++ ;
                                    costoSencilloFondeoRegio += asset.getCostoSenReg() ;
                                    costoCampania += costoSencilloFondeoRegio ;
                                    
                                }else
                                    if( p.getHabitacion( ) == 2 && p.getFondeado( ) == 1 ){//DL
                                        
                                        doblesFondeoLocal ++ ;
                                        costoDoblesFondeoLocal += asset.getCostoDobLoc( ) ;
                                        costoCampania += costoDoblesFondeoLocal ;
                                        
                                    }else
                                        if( p.getHabitacion( ) == 2 && p.getFondeado( ) == 2 ){//DR
                                            
                                            doblesFondeoRegion ++ ;
                                            costoDoblesFondeoRegio += asset.getCostoDobReg( ) ;
                                            costoCampania += costoDoblesFondeoRegio ;
                                            
                                        }
                            
                        }                        
                        
                    }//recorre paquetes fin
                    boolean aumenta = false ;
                    
                    if( sencillosFondeoLocal > 0 ){
                        tipoPaq.add(i, "Sencillo") ;
                        numPaq.add(i, sencillosFondeoLocal ) ;
                        costoPaq.add(i, costoSencilloFondeoLocal) ;
                        fondeo.add(i, "Local");
                        
                        aumenta = true ;
                    }
                    
                    if( sencillosFondeoRegion > 0 ){
                        
                        if( aumenta ){
                            i++ ;
                            assetNmae.add(i, assetList.get( 0 ).getNombre( ) ) ;
                        }                        
                        
                        tipoPaq.add(i, "Sencillo") ;
                        numPaq.add(i, sencillosFondeoRegion ) ;
                        costoPaq.add(i, costoSencilloFondeoRegio) ;
                        fondeo.add(i, "Regional");
                        
                        aumenta = true ;
                        
                    }
                    
                    if( doblesFondeoLocal > 0 ){
                        
                        if( aumenta ){
                            i++ ;
                            assetNmae.add(i, assetList.get( 0 ).getNombre( ) ) ;
                        }                        
                        
                        tipoPaq.add(i, "Doble") ;
                        numPaq.add(i, doblesFondeoLocal ) ;
                        costoPaq.add(i, costoDoblesFondeoLocal) ;
                        fondeo.add(i, "Local");
                        
                         aumenta = true ;
                        
                    }
                    
                    if( doblesFondeoRegion > 0 ){
                        
                        if( aumenta ){
                            i++ ;
                            assetNmae.add(i, assetList.get( 0 ).getNombre( ) ) ;
                        }                        
                        
                        tipoPaq.add(i, "Doble") ;
                        numPaq.add(i, doblesFondeoRegion ) ;
                        costoPaq.add(i, costoDoblesFondeoRegio) ;
                        fondeo.add(i, "Regional");
                       
                    }
                    
                    i++ ;
                    
                }// recorre preimplementacion Fin
		
		FlowCampaignTO to = new FlowCampaignTO( ) ;//
                
                DecimalFormat df = new DecimalFormat();
                df.setMaximumFractionDigits(2);
                laverage = inverBanco/costoCampania ;
                laverage = Float.parseFloat( df.format( laverage ) ) ;
                BigDecimal nRoi = new BigDecimal( 0 ) , precioCampana = new BigDecimal( Float.toString( costoCampania ) ) ;
                nRoi = campania.getRevenue().divide( precioCampana, 4, RoundingMode.UP) ;
                campania.setRoi( nRoi ) ;
		
		to.setCveFlow( tblFlujo.getCveFlujo( ) ) ;//
		to.setFlow( tblFlujo ) ;//
		to.setTblTareaPreimplementacion( tblTareaPreimplementacion ) ;//
		to.setCampania( campania ) ;
                to.setWithFile( true ) ;
                to.setAssetS( assetS ) ;
                to.setMeses( meses ) ;
                to.setTblCampaniaProductoAdq( tblCampaniaProductoAdq ) ;
                to.setTblCampaniaProductoUsr( tblCampaniaProductoUsuario ) ;
                to.setTtp( ttp ) ;
                to.setTotal( total ) ;
                to.setTblCampaniaMeses( TblCampaniaMes ) ;
                to.setAssetNmae( assetNmae ) ;
                to.setTipoPaq( tipoPaq ) ;
                to.setNumPaq( numPaq ) ;
                to.setCostoPaq( costoPaq ) ;
                to.setFondeo( fondeo ) ;
                to.setLaverage( laverage ) ;
		
		// extrae la tarea
		TblTarea tarea = tblTareaPreimplementacion.getTblTarea( ) ;//
		
		// extrae la forma
		TblForma forma = tarea.getTblForma( ) ;//
		
		// nombre del jsp
		String jspName = forma.getArchivoForma( ) ;//
		// ruta completa del jsp
		URL ruta = null ;//   
                try
		{
			System.out.println( "@@@@@@@@@@@@@@@@@@@" + MCUtil.getFormsDirToDisplay( ) + System.getProperty( "file.separator" ) + jspName ) ;
			ruta = new URL( "file" , "localhost" , MCUtil.getFormsDirToDisplay( ) + System.getProperty( "file.separator" ) + jspName ) ;
			
			System.out.println( "@@@@@@@@@@@@@@@@@@@" + ruta ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_ERROR_OBTAINING_PATH , MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.ErrorCalculatingPath" , e.getMessage( ) ) , e ) ;
		}
                

//		String jspPath = ruta.getQuery( ) ;
		String jspPath = "/WEB-INF/formas/" + jspName ;//
		
		System.out.println( "FlowUtil.java: jspPath/" + jspPath ) ;//
		
		java.util.List< TblAsset > assets = new ArrayList< TblAsset >( ) ;//
		java.util.List< TblAsset > assetsDelFlujo = tblPreimplementacion.getTblAssets( ) ;//
		
		// recorre assets
		for( TblAsset asset : assetsDelFlujo )//
			// en caso de que este activo
			if( asset.getStatus( ) == 1 )//
				assets.add( asset ) ;//
		
		// coloca en el to
		to.setAssets( assets ) ;//
		
		// abre el archivo
		File dir = new File( MCUtil.getFormsDir( ) ) ;
//		System.out.println( "***********" + dir.getAbsolutePath( ) ) ;
		File f = new File( dir , jspName ) ;
//		System.out.println( "***********" + f.getAbsolutePath( ) ) ;
		
//		System.getProperties( ).list( System.out ) ;
		
		String fileCode = "" ;
		StringBuffer sb = new StringBuffer( ) ;
                
                try
		{
			System.out.println( "PreimplementationAbrirBCFormProcess.java: lecturaJSP/" ) ;
			BufferedReader rIn = new BufferedReader( new FileReader( f ) ) ;
			
			System.out.println( "PreimplementationAbrirBCFormProcess.java: lecturaJSP/1" ) ;
			String line = "" ;
			
			System.out.println( "PreimplementationAbrirBCFormProcess.java: lecturaJSP/2" ) ;
			while( ( line = rIn.readLine( ) ) != null )
				sb.append( line ) ;
			
			System.out.println( "PreimplementationAbrirBCFormProcess.java: lecturaJSP/3" ) ;
			rIn.close( ) ;
			
			System.out.println( "PreimplementationAbrirBCFormProcess.java: lecturaJSP/4" ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			MasterCardDAO.closeEntityManager( ) ;
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_NO_FORM_FILE_EXIST , MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFormFileExist" , jspName ) , e ) ;
		}
                
                System.out.println( "PreimplementationAbrirBCFormProcess.java: lecturaJSP/5" ) ;//                
//		System.out.println( sb.toString( ) ) ;
		
		// coloca la ruta del jsp
		to.setJspPath( jspPath ) ;
		to.setJspCode( sb.toString( ) ) ;
		
		sb.setLength( 0 ) ;
		sb = null ;
		
		System.out.println( "PreimplementationAbrirBCFormProcess.java: to/" + to ) ;
		System.out.println( "PreimplementationAbrirBCFormProcess.java: to.getError/" + to.getError( ) ) ;
//		System.out.println( "PreimplementationAbrirBCFormProcess.java: busca/cvePreimplementacion/" + cvePreimplementacion ) ;
//		System.out.println( "PreimplementationAbrirBCFormProcess.java: busca/cveAsset/" + cveAsset ) ;
//		System.out.println( "PreimplementationAbrirBCFormProcess.java: busca/cveFirstWork/" + cveFirstWork ) ;
		
                MasterCardDAO.closeEntityManager( ) ;
		return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_CAN_DISPLAY , to ) ;
		
                
 }
    
    public FlowProcessResult canDisplay( FlowProcessContext ctx )
	{
		TblTareaPreimplementacion tblTareaPreimplementacion = ctx.getTblTareaPreimplementacion( ) ;
		
		// en caso de uqe ya este ejecutado
		if( tblTareaPreimplementacion.getEjecutado( ) == 1 )
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_WORK_FLOW_EXECUTED ) ;
		
		// toma las clases para procesar la forma antes de desplegarla
		// toma la tarea
		TblTarea tarea = tblTareaPreimplementacion.getTblTarea( ) ;
		
		String nombreTarea = tarea.getNombre( ) ;
		
		// en caso de que la tarea haya sido desactivada
		if( tarea.getStatus( ) == 0 )
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_WORK_FLOW_WORK_DESACTIVATED ) ;
		
		// toma la forma a la que esta ligada la tarea
		TblForma forma = tarea.getTblForma( ) ;
		
		// en caso de que la forma este desactivada
		if( forma.getStatus( ) == 0 )
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_WORK_FLOW_WORK_FORM_DESACTIVATED ) ;
		
		/// se pueden agregar mas filtros
		
		return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_CAN_DISPLAY ) ;
	}
    
    public FlowProcessResult processExit( FlowProcessContext ctx )
		throws
			MasterCardException
	{
		
                int stepupResult = -1 ;
                
                //primero el archivo
                TblTareaPreimplementacion tblTareaPreimplementacion = ctx.getTblTareaPreimplementacion( ) ;
		
                TblCampania campania = tblTareaPreimplementacion.getTblPreimplementacion( ).getTblCampania( ) ;
                
                FlowProcessForm forma = ( FlowProcessForm ) ctx.getUser( ).getAttribute( "FlowProcessForma" ) ;
                
                HttpServletRequest request = ctx.getRequest( ) ;
                
                String exit = forma.getExit( ) ;
                
                if ( exit.equals( "Autorizar" ) )
                {                 
                    
                    // procesa los comentarios y el BC
                    // los guarda en BD
                    try
                    {                            

                            String comentarios = request.getParameter( "comentarios" ) ;

                            StringBuffer sb = new StringBuffer( ) ;

                            if( comentarios == null )
                                    comentarios = "" ;
                            
                            int idTarea = tblTareaPreimplementacion.getTblTarea().getCveTarea( ) ;
 
                            
//                           stepupResult = MasterCardDAO.processCampaignFlowSreen1A( ctx.getUser( ) , bc , ctx.getTblTareaPreimplementacion( ) , ctx.getForm( ).getExit( ) ) ;
                        stepupResult = MasterCardDAO.processCampaignFlowSreen1A( ctx.getUser( ) , ctx.getTblTareaPreimplementacion( ) , ctx.getForm( ).getExit( ) ) ;
                           
                           return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_SUCCESS , stepupResult ) ;
                            
                    }catch( Exception e )
                    {
                            e.printStackTrace( ) ;
                            MasterCardDAO.closeEntityManager( ) ;
                            return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_ERROR_RELOAD , e.getMessage( ) , e ) ;
                    }
                    
                }else
                    
                    try
                    {
//			MasterCardDAO.unauthorizeCampaign( campania.getCveCampania() ) ;
                        
                                        
                        MasterCardDAO.cancelCampaign( campania.getCveCampania() , ctx.getUser( ).getCveUsuario( ) , 0 ) ;
			
                    }catch( Exception e )
			{
                            MasterCardDAO.closeEntityManager( ) ;
				e.printStackTrace( ) ;
			}
		
		
                MasterCardDAO.closeEntityManager( ) ;
		return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_SUCCESS ) ;
	}
    
}
